home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / tar-1_11.lha / tar-1.11.2 / getoldopt.c < prev    next >
C/C++ Source or Header  |  1992-11-24  |  2KB  |  97 lines

  1. /* Replacement for getopt() that can be used by tar.
  2.    Copyright (C) 1988 Free Software Foundation
  3.  
  4. This file is part of GNU Tar.
  5.  
  6. GNU Tar is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU Tar is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU Tar; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /*
  21.  * Plug-compatible replacement for getopt() for parsing tar-like
  22.  * arguments.  If the first argument begins with "-", it uses getopt;
  23.  * otherwise, it uses the old rules used by tar, dump, and ps.
  24.  *
  25.  * Written 25 August 1985 by John Gilmore (ihnp4!hoptoad!gnu)
  26.  */
  27.  
  28. #include <stdio.h>
  29. #include "getopt.h"
  30. #include "tar.h"        /* For msg() declaration if STDC_MSG. */
  31. #include <sys/types.h>
  32. #include "port.h"
  33.  
  34. int
  35. getoldopt (argc, argv, optstring, long_options, opt_index)
  36.      int argc;
  37.      char **argv;
  38.      char *optstring;
  39.      struct option *long_options;
  40.      int *opt_index;
  41. {
  42.   extern char *optarg;        /* Points to next arg */
  43.   extern int optind;        /* Global argv index */
  44.   static char *key;        /* Points to next keyletter */
  45.   static char use_getopt;    /* !=0 if argv[1][0] was '-' */
  46.   char c;
  47.   char *place;
  48.  
  49.   optarg = NULL;
  50.  
  51.   if (key == NULL)
  52.     {                /* First time */
  53.       if (argc < 2)
  54.     return EOF;
  55.       key = argv[1];
  56.       if ((*key == '-') || (*key == '+'))
  57.     use_getopt++;
  58.       else
  59.     optind = 2;
  60.     }
  61.  
  62.   if (use_getopt)
  63.     return getopt_long (argc, argv, optstring,
  64.             long_options, opt_index);
  65.  
  66.   c = *key++;
  67.   if (c == '\0')
  68.     {
  69.       key--;
  70.       return EOF;
  71.     }
  72.   place = index (optstring, c);
  73.  
  74.   if (place == NULL || c == ':')
  75.     {
  76.       msg ("unknown option %c", c);
  77.       return ('?');
  78.     }
  79.  
  80.   place++;
  81.   if (*place == ':')
  82.     {
  83.       if (optind < argc)
  84.     {
  85.       optarg = argv[optind];
  86.       optind++;
  87.     }
  88.       else
  89.     {
  90.       msg ("%c argument missing", c);
  91.       return ('?');
  92.     }
  93.     }
  94.  
  95.   return (c);
  96. }
  97.